<?php
/**
 * Controller de Usuario.
 *
 *
 * @filesource          
 * @copyright		
 * @link		http://www.pragmatia.com Pragmatia
 * @package		datagro
 * @subpackage	app.controllers
 * @version     1.1
 * @license		http://www.opensource.org/licenses/mit-license.php The MIT License
 * @author      Martin Radosta <mradosta@pragmatia.com>
 */


/**
 * Clase UsuariosController
 *
 * @package	    datagro
 * @subpackage	app.controllers
 */

class UsuariosController extends AppController 
{ 
    var $name = "Usuarios"; 
	var $uses = array("Usuario", "Menu", "Sim", "Cliente");


/**
 * deSeleccionar.
 * Permite que el administrador se conviertio en otro otro usuario vuelva a ser quien era.
 *
 */
	function deseleccionar() {
		$usuario = $this->Session->read('Usuario');
		if(!empty($usuario['usuarioAnterior']) && !empty($usuario['Auditar']['puedeDeseleccionar']) && $usuario['Auditar']['puedeDeseleccionar'] == true) {
			$nuevoUsuario = $usuario['usuarioAnterior'];
			$this->__buscarMenu($nuevoUsuario);
			$this->Session->write('Usuario', $nuevoUsuario);
			$this->Session->setFlash('El usuario se deselecciono correctamente.', 'ok');
		}
		$this->redirect('./index', null, true);
	}



/**
 * Seleccionar.
 * Permite que el administrador se convierta en otro usuario y no sea auditado como tal.
 *
 */
	function seleccionar($id)
	{
		$usuario = $this->Session->read('Usuario');
		if($usuario['Grupo']['id'] == 1) {
			$nuevoUsuario = $this->Usuario->findById($id);
		}
		$nuevoUsuario['Auditar'] = array("omitirAuditoria"=>true, "puedeDeseleccionar"=>true);
		$nuevoUsuario['usuarioAnterior'] = $usuario;
		$this->Session->write('Usuario', $nuevoUsuario);
		$this->__buscarMenu($nuevoUsuario);
		$this->Session->setFlash('El usuario se selecciono correctamente.', 'ok');
		$this->redirect('../inicios/index', null, true);
	}


/**
 * Index.
 *
 */
	function index() 
	{
		if(!empty($this->data))
		{
			$condicion = $this->Filtro->generarCondicion($this->data['Filtro']);
			$this->paginate['conditions'] = $condicion;
		}

		$this->set('grupos', $this->Usuario->Grupo->generateList(null, null, null, null, "{n}.Grupo.nombre"));
		$this->set('estados_seguridad', $this->Usuario->EstadoSeguridad->generateList(null, null, null, null, "{n}.Dominio.valor"));	$this->set('registros', $this->paginate());
	}


/**
 * Exportar.
 *
 */
	function exportar() 
	{ 
		$this->set('registros', $this->Usuario->findAll(null, null, "Usuario.grupo_id, Usuario.nombre"));
		$this->layout = "excel"; 
	}


/**
 * View.
 *
 */
	function view($id = false) 
	{
		if($id === false) {
			$usuario = $this->Session->read('Usuario');
			$id = $usuario['Usuario']['id'];
		}
		if ($id && is_numeric($id))
		{
			$this->Usuario->recursive=2;
			$this->data = $this->Usuario->read(null, $id);
		}    
	}  

    function login() 
    { 
        if(!empty($this->data)) { 
			loadModel('Auditoria');
			$Auditoria =& new Auditoria(); 
			$datos = array();
			$datos['controlador'] = $this->name;
			$datos['accion'] = $this->action;

			$usuario = $this->Usuario->validarUsuario($this->data['Usuario']);

			//si es un cliente, seteo el sim que tiene ya seleccionado
			if(!empty($usuario['Usuario']['usuario_id'])) {
				$cliente = $this->Cliente->findById($usuario['Usuario']['id']);
				$this->Session->write('Sim', array("Sim"=>$cliente['Sim'])); 
			}

            if($usuario) { 
				$datos['tipo'] = dominio("tipo_auditoria", "Ingreso");
				$Auditoria->auditar($usuario, $datos);

				$this->__buscarMenu($usuario);
				
                $this->Session->write('Usuario', $usuario);
				$this->redirect('../inicios/index', null, true);


            } 
            else { 
				$datos['tipo'] = dominio("tipo_auditoria", "Ingreso Fallido");
				$Auditoria->auditar(array("Usuario"=>array("usuario_id"=>"-1")), $datos);

               	$this->Session->setFlash('El usuario y/o clave ingresados son incorrectos.');
				$this->redirect('../index.php', null, true);
            } 
        } 
		else {
			$this->layout = "login";
		}
    } 
     
    function logout() 
    { 
        $this->Session->destroy('Usuario'); 
        //$this->Session->setFlash('Ha salido exitosamente de la aplicacion.', 'ok'); 
        $this->redirect('../index.php', null, true);
    } 


    function cambiarClave() 
    { 
		$usuario = $this->Session->read('Usuario');
		$this->data = $this->Usuario->read(null, $usuario['Usuario']['id']);
	} 

/**
 * Add.
 *
 */
	function add() {
		$this->Formato->formatearFechaHora();
		if(!empty($this->data) && isset($this->data['Usuario']['accion']) && ($this->data['Usuario']['accion'] == "grabar" || $this->data['Usuario']['accion'] == "cancelar")) {
			if ($this->data['Usuario']['accion'] == "grabar") {
				if($this->Usuario->create($this->data) && $this->Usuario->validates()) {
					if($this->Usuario->save($this->data)) {
						$sims = $this->Session->read("Sims.seleccionados");
						$this->Session->del("Sims.seleccionados");
						if(is_array($sims) && !empty($sims))
							foreach($sims as $k=>$v) {
								$save['id'] = $v;
								$save['usuario_id'] = $this->Usuario->getLastInsertId();
								$this->Sim->save($save);
							}
						$this->Session->setFlash('El usuario se agrego correctamente.', 'ok');
					}
					else
						$this->Session->setFlash('No fue posible agregar el nuevo usuario.', 'error');	
						$this->redirect("index", null, true);
				}
				else {
					$this->Session->del("Sims.seleccionados");
					$this->set('libres', $this->Usuario->Sim->findAll(array("Sim.usuario_id"=>"0")));
					$this->set('asignados', array());

					$this->set('usuarios', $this->Usuario->generateList(null, null, null, null, "{n}.Usuario.nombre"));
					$this->set('grupos', $this->Usuario->Grupo->generateList(null, null, null, null, "{n}.Grupo.nombre"));
					$this->set('estados_seguridad', $this->Usuario->EstadoSeguridad->generateList(null, null, null, null, "{n}.Dominio.valor"));
					$this->set('tipos_iva', $this->Usuario->TipoIva->generateList(null, null, null, null, "{n}.Dominio.valor"));
				}
			}
			elseif($this->data['Usuario']['accion'] == "cancelar") {
				$this->redirect("index", null, true);
			}
		}
		else {
			$this->Session->del("Sims.seleccionados");
			$this->set('libres', $this->Usuario->Sim->findAll(array("Sim.usuario_id"=>"0")));
			$this->set('asignados', array());

			$this->set('usuarios', $this->Usuario->generateList(null, null, null, null, "{n}.Usuario.nombre"));
			$this->set('grupos', $this->Usuario->Grupo->generateList(null, null, null, null, "{n}.Grupo.nombre"));
			$this->set('estados_seguridad', $this->Usuario->EstadoSeguridad->generateList(null, null, null, null, "{n}.Dominio.valor"));
			$this->set('tipos_iva', $this->Usuario->TipoIva->generateList(null, null, null, null, "{n}.Dominio.valor"));
		}
	}


/**
 * Edit.
 *
 */
	function edit($id) {
		if(!empty($this->data) && isset($this->data['Usuario']['accion']) && ($this->data['Usuario']['accion'] == "grabar" || $this->data['Usuario']['accion'] == "cancelar")) {

			if ($this->data['Usuario']['accion'] == "grabar") {
				$this->Formato->formatearFechaHora();
				if($this->Usuario->create($this->data) && $this->Usuario->validates()) {
					$this->Usuario->save($this->data);
					if($this->Usuario->save($this->data)) {
						//los asigandos vuelven a estar libres
						$sims = $this->Session->read("Sims.asignados");
						$this->Session->del("Sims.asignados");
						if(is_array($sims) && !empty($sims))
							foreach($sims as $k=>$v) {
								$save['id'] = $v;
								$save['usuario_id'] = 0;
								$this->Sim->save($save);
							}

						//los seleciconados se los asigno al usuario
						$sims = $this->Session->read("Sims.seleccionados");
						$this->Session->del("Sims.seleccionados");
						if(is_array($sims) && !empty($sims))
							foreach($sims as $k=>$v) {
								$save['id'] = $v;
								$save['usuario_id'] = $this->data['Usuario']['id'];
								$this->Sim->save($save);
							}

						$this->Session->del("Usuario.id");
						$this->Session->setFlash('El usuario se actualizo correctamente.', 'ok');
					}
					else
						$this->Session->setFlash('No fue posible actualizar el usuario.', 'error');	

						if(isset($this->data['Usuario']['cambiarClave']))
							$this->redirect("cambiarClave", null, true);
						else
							$this->redirect("index", null, true);
				}
				else {
					$this->Session->del("Sims.seleccionados");
					$this->set('libres', $this->Usuario->Sim->findAll(array("Sim.usuario_id"=>"0")));
					$sims_asignados = $this->Usuario->Sim->findAll(array("Sim.usuario_id"=>$id));
					$detalles = array();
					foreach($sims_asignados as $v) {
						$detalles[] = $v['Sim']['id'];
					}
					if(!empty($detalles)) {
						$this->Session->write("Sims.seleccionados", $detalles);
						$this->Session->write("Sims.asignados", $detalles);
					}
					$this->set('asignados', $sims_asignados);

					$this->set('usuarios', $this->Usuario->generateList(null, null, null, null, "{n}.Usuario.nombre"));
					$this->set('grupos', $this->Usuario->Grupo->generateList(null, null, null, null, "{n}.Grupo.nombre"));
					$this->set('estados_seguridad', $this->Usuario->EstadoSeguridad->generateList(null, null, null, null, "{n}.Dominio.valor"));
					$this->set('tipos_iva', $this->Usuario->TipoIva->generateList(null, null, null, null, "{n}.Dominio.valor"));
					$this->render('add');
				}
			}
			elseif($this->data['Usuario']['accion'] == "cancelar") {
				if(isset($this->data['Usuario']['cambiarClave']))
					$this->redirect("cambiarClave", null, true);
				else
					$this->redirect("index", null, true);
			}
		}
		else {
			$this->Session->del("Sims.seleccionados");
			$this->set('libres', $this->Usuario->Sim->findAll(array("Sim.usuario_id"=>"0")));
			$sims_asignados = $this->Usuario->Sim->findAll(array("Sim.usuario_id"=>$id));
			$detalles = array();
			foreach($sims_asignados as $v) {
				$detalles[] = $v['Sim']['id'];
			}
			if(!empty($detalles)) {
				$this->Session->write("Sims.seleccionados", $detalles);
				$this->Session->write("Sims.asignados", $detalles);
			}
			$this->set('asignados', $sims_asignados);

			$this->Usuario->recursive = 2;
			$this->data = $this->Usuario->read(null, $id);
			$this->Session->write("Usuario.id", $id);
			$this->set('usuarios', $this->Usuario->generateList(null, null, null, null, "{n}.Usuario.nombre"));
			$this->set('grupos', $this->Usuario->Grupo->generateList(null, null, null, null, "{n}.Grupo.nombre"));
			$this->set('estados_seguridad', $this->Usuario->EstadoSeguridad->generateList(null, null, null, null, "{n}.Dominio.valor"));
			$this->set('tipos_iva', $this->Usuario->TipoIva->generateList(null, null, null, null, "{n}.Dominio.valor"));

			$this->render("add");
		}
	}

/** 
 * Agrega una Sim
 * @return void
 * @param  int  $id	Id del albaran que se agrego.
*/
    function agregar($id)
    {
        $detalles = $this->Session->read("Sims.seleccionados");
        $detalles[] = $id;
        $this->Session->write("Sims.seleccionados", $detalles);

		if(!empty($detalles)) {
			$this->set('libres', $this->Usuario->Sim->findAll(array('OR'=>array(array("Sim.usuario_id"=>"0"), array( "Sim.usuario_id"=>$this->Session->read("Usuario.id"))), 'NOT' => array('Sim.id' => $detalles))));
			$this->set('asignados', $this->Usuario->Sim->findAll(array("IN"=>array("Sim.id" => $detalles))));
		}
		else {
			$this->set('libres', $this->Usuario->Sim->findAll(array('OR'=>array(array("Sim.usuario_id"=>"0"), array( "Sim.usuario_id"=>$this->Session->read("Usuario.id"))))));
			$this->set('asignados', array());
		}

		$this->set('soloTablas', '1');
        $this->render('add', 'ajax');
    }

/** 
 * Quita una sim
 * @return void
 * @param  int  $id	Id del albaran que se quito.
*/
    function quitar($id)
    {
        $sims = $this->Session->read("Sims.seleccionados");
        $detalles = false;
        foreach($sims as $sim_id)
        {
            if ($sim_id <> $id)
            {
                $detalles[] = $sim_id;
            }
        }

		if(!empty($detalles)) {
			$this->Session->write("Sims.seleccionados", $detalles);
			$this->set('libres', $this->Usuario->Sim->findAll(array('OR'=>array(array("Sim.usuario_id"=>"0"), array( "Sim.usuario_id"=>$this->Session->read("Usuario.id"))), 'NOT' => array('Sim.id' => $detalles))));
			$this->set('asignados', $this->Usuario->Sim->findAll(array("IN"=>array("Sim.id" => $detalles))));
		}
		else {
			$this->Session->del("Sims.seleccionados");
			$this->set('libres', $this->Usuario->Sim->findAll(array('OR'=>array(array("Sim.usuario_id"=>"0"), array( "Sim.usuario_id"=>$this->Session->read("Usuario.id"))))));
			$this->set('asignados', array());
		}
		$this->set('soloTablas', '1');
        $this->render('add', 'ajax');
    }


/** 
 * Quita un abono
 * @return void
 * @param  int  $id	Id del albaran que se quito.
*/
    function quitarAbono($usuario_id = false, $abono_id = false)
    {
		if ($usuario_id && is_numeric($usuario_id) && $abono_id && is_numeric($abono_id)) {
			$abonos_usuario = $this->Usuario->AbonosUsuario->find(array("AbonosUsuario.usuario_id"=>$usuario_id, "AbonosUsuario.abono_id"=>$abono_id));
			if(isset($abonos_usuario['AbonosUsuario']['id'])) {
				$this->Usuario->AbonosUsuario->delete($abonos_usuario['AbonosUsuario']['id']);
			}

			$this->redirect('edit/' . $usuario_id, null, true); 
		}
		else
			$this->redirect('index', null, true); 
	}

/**
 * Busco la informacion para pintar el menu y la dejo en la session
 */

	function __buscarMenu($usuario) {
		$menus = $this->Menu->findAll(null, null, "Menu.orden");
		foreach($menus as $k=>$v) {
			//$v['Menu']['enlace'] = str_replace("//**usuario_id**//", $usuario['Usuario']['id'], $v['Menu']['enlace']);
			foreach($v['Grupo'] as $k1=>$v1) {
				if($v1['id'] == $usuario['Grupo']['id']) {
					if ($v['Menu']['menu_id'] == 0) {
						$padres[$v['Menu']['id']] = $v['Menu'];
					}
					else { //es un hijo
						$padres[$v['Menu']['menu_id']]['hijos'][] = $v['Menu'];
					}
				}
				else
					continue;
			}
		}
		$this->Session->write('MenuItems', $padres);
	}
} 

?>